home *** CD-ROM | disk | FTP | other *** search
/ Revista do CD-ROM 124 / cd-rom 124.iso / edu / tuxmath / tuxmathscrabble / asymptopia / Localizer.py < prev    next >
Encoding:
Python Source  |  2003-11-09  |  7.4 KB  |  249 lines

  1. """
  2. /***************************************************************************
  3.  
  4.     Author             :Charles B. Cosse 
  5.     
  6.     Email            :ccosse@asymptopia.com
  7.                     
  8.                     
  9.     Copyright        :(C) 2002,2003 Asymptopia Software.
  10.     
  11.  ***************************************************************************/
  12. /***************************************************************************
  13.                           Localizer.py
  14.  
  15.  
  16.  ***************************************************************************/
  17.  
  18. /***************************************************************************
  19.  *                                                                         *
  20.  *   This program is free software; you can redistribute it and/or modify  *
  21.  *   it under the terms of the GNU General Public License as published by  *
  22.  *   the Free Software Foundation; either version 2 of the License, or     *
  23.  *   (at your option) any later version. (Please note that if you use this *
  24.  *   code you must give credit by including the Author and Copyright       *
  25.  *   info at the top of this file).                                        *
  26.  ***************************************************************************/
  27.  
  28. """
  29. import pygame,os
  30. from pygame.locals import *
  31. from random import random
  32.  
  33. class Localizer:
  34.     """Localizer has game model.
  35.     """
  36.     def __init__(self,board,game):
  37.         self.board=board
  38.         self.game=game#only used to update score
  39.         self.board_map=None
  40.         self.M=self.board.M
  41.         self.N=self.board.N
  42.  
  43.     #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
  44.     #NEW FUNCTION V2.0
  45.     #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
  46.     def update_board_map(self):
  47.         #returns a 2D array of str_vals
  48.         self.board_map=self.board.get_map()
  49.     
  50.     #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
  51.     #NEW LOCALIZER
  52.     #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
  53.     def localize(self,submission):
  54.         
  55.         #flip coin to decide whether to try row or col first:
  56.         rand=int(random()*2)
  57.         if rand==0:
  58.             rlist=self.try_row(submission)
  59.             if rlist:return(rlist)
  60.             rlist=self.try_col(submission)
  61.             if rlist:return(rlist)
  62.         else:    
  63.             rlist=self.try_col(submission)
  64.             if rlist:return(rlist)
  65.             rlist=self.try_row(submission)
  66.             if rlist:return(rlist)
  67.         return(None)
  68.         
  69.     def try_row(self,submission):    
  70.         board_map=self.board_map
  71.         M=self.M
  72.         N=self.N
  73.         if len(submission)==0:return(None)
  74.         if len(self.board.get_listofheads())==0:return(None)
  75.         slim=len(submission)
  76.         nlim=N-len(submission)+1
  77.         for m in range(M):
  78.             for n in range(nlim):
  79.                 ok=1
  80.                 for sidx in range(slim):
  81.                     if submission[sidx][:3]=='WC:':
  82.                         if board_map[m][n+sidx]==submission[sidx][3:]:
  83.                             dummy=0
  84.                             #print submission,'we have match:',submission[sidx],' at m,n = ',m,n+sidx
  85.                         else:ok=0
  86.                     elif board_map[m][n+sidx]=='':dummy=0
  87.                     else:
  88.                         #print 'ROW: setting->0 b/c board ',m,n+sidx,' !=\'\' ',board_map[m][n+sidx],submission[sidx][:3]
  89.                         ok=0;
  90.                 if ok==1:#head @(m,n)
  91.                     rlist=[]
  92.                     for idx in range(slim):
  93.                         tripple=[submission[idx],m,n+idx]
  94.                         #if tripple[0][:3]=='WC:':dummy=0  <-remove these after check;keep "WC:" in the value
  95.                         #else:rlist.append(tripple)
  96.                         rlist.append(tripple)
  97.                     rval=self.check_neighborhood(rlist)
  98.                     #print 'check_neighborhood returned:',rval
  99.                     
  100.                     tuxscore=0
  101.                     multiplier=1
  102.                     for nn in range(n,n+len(rlist)):
  103.                         spot2check=self.board.get_spotMN(m,nn    )
  104.                         if spot2check.TYPE=='2XL':tuxscore=tuxscore+2
  105.                         elif spot2check.TYPE=='2XW':
  106.                             tuxscore=tuxscore+1
  107.                             multiplier=multiplier*2
  108.                         elif spot2check.TYPE=='3XL':tuxscore=tuxscore+3
  109.                         elif spot2check.TYPE=='3XW':
  110.                             tuxscore=tuxscore+1
  111.                             multiplier=multiplier*3
  112.                         else:tuxscore=tuxscore+1
  113.                     tuxscore=tuxscore*multiplier
  114.                     
  115.                     #now remove "WC:"s
  116.                     for idx in range(slim-1,-1,-1):
  117.                         if rlist[idx][0][:3]=='WC:':rlist.pop(idx)
  118.                     if rval==1:
  119.                         self.game.tuxscore=self.game.tuxscore+tuxscore
  120.                         return(rlist)
  121.         return(None)
  122.         
  123.     def try_col(self,submission):    
  124.         board_map=self.board_map
  125.         M=self.M
  126.         N=self.N
  127.         if len(submission)==0:return(None)
  128.         if len(self.board.get_listofheads())==0:return(None)
  129.         slim=len(submission)
  130.         mlim=M-len(submission)+1
  131.         for n in range(N):
  132.             for m in range(mlim):
  133.                 ok=1
  134.                 for sidx in range(slim):
  135.                     if submission[sidx][:3]=='WC:':
  136.                         if board_map[m+sidx][n]==submission[sidx][3:]:
  137.                             #print submission,'we have match:',submission[sidx],' at m,n = ',m+sidx,n
  138.                             dummy=0
  139.                         else:ok=0
  140.                     elif board_map[m+sidx][n]=='':dummy=0
  141.                     else:
  142.                         #print 'COL: setting->0 b/c board ',m+sidx,n,' !=\'\' ',board_map[m+sidx][n],submission[sidx][:3]
  143.                         ok=0;
  144.                 if ok==1:#head @(m,n)
  145.                     rlist=[]
  146.                     for idx in range(slim):
  147.                         tripple=[submission[idx],m+idx,n]
  148.                         #if tripple[0][:3]=='WC:':dummy=0
  149.                         #else:rlist.append(tripple)
  150.                         rlist.append(tripple)
  151.                     rval=self.check_neighborhood(rlist)
  152.                     #print 'check_neighborhood returned:',rval
  153.                     
  154.                     tuxscore=0
  155.                     multiplier=1
  156.                     for mm in range(m,m+len(rlist)):
  157.                         spot2check=self.board.get_spotMN(mm,n)
  158.                         if spot2check.TYPE=='2XL':tuxscore=tuxscore+2
  159.                         elif spot2check.TYPE=='2XW':
  160.                             tuxscore=tuxscore+1
  161.                             multiplier=multiplier*2
  162.                         elif spot2check.TYPE=='3XL':tuxscore=tuxscore+3
  163.                         elif spot2check.TYPE=='3XW':
  164.                             tuxscore=tuxscore+1
  165.                             multiplier=multiplier*3
  166.                         else:tuxscore=tuxscore+1
  167.                     tuxscore=tuxscore*multiplier
  168.             
  169.                     
  170.                     
  171.                     #now remove "WC:"s
  172.                     for idx in range(slim-1,-1,-1):
  173.                         if rlist[idx][0][:3]=='WC:':rlist.pop(idx)
  174.                     
  175.                     
  176.                     if rval==1:
  177.                         self.game.tuxscore=self.game.tuxscore+tuxscore
  178.                         return(rlist)
  179.         return(None)
  180.     
  181.     #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
  182.     #CHECK NEIGHBORHOOD
  183.     #NOTE: still not chaining adjacent eqns...might leave off for now.
  184.     #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
  185.     def check_neighborhood(self,rlist):
  186.         board_map=self.board_map
  187.         M=self.M
  188.         N=self.N
  189.         
  190.         ok=1
  191.         slen=len(rlist)
  192.         head=(rlist[0][1],rlist[0][2])
  193.         tail=(rlist[slen-1][1],rlist[slen-1][2])
  194.         if rlist[0][2]==rlist[1][2]:
  195.             iscol=1
  196.             col=rlist[0][2]
  197.         else:
  198.             iscol=0
  199.             row=rlist[0][1]
  200.         
  201.         if iscol:
  202.             #check above:
  203.             if head[0]==0:pass
  204.             elif board_map[head[0]-1][col]!='':ok=-1;return(ok)
  205.             else:pass
  206.             #check below:
  207.             if tail[0]==M-1:pass
  208.             elif board_map[tail[0]+1][col]!='':ok=-2;return(ok)
  209.             else:pass
  210.             #check left:
  211.             if col==0:pass
  212.             else:
  213.                 #for ridx in range(head[0],tail[0]):
  214.                 for qty in rlist:
  215.                     if qty[0][:3]=='WC:':pass
  216.                     elif board_map[qty[1]][col-1]!='':ok=-3;return(ok)
  217.             #check right:
  218.             if col==N-1:pass
  219.             else:
  220.                 #for ridx in range(head[0],tail[0]):
  221.                 for qty in rlist:
  222.                     if qty[0][:3]=='WC:':pass
  223.                     elif board_map[qty[1]][col+1]!='':ok=-4;return(ok)
  224.             
  225.         else:#submission is a row
  226.             #check left:
  227.             if head[1]==0:pass
  228.             elif board_map[row][head[1]-1]!='':ok=-5;return(ok)
  229.             else:pass
  230.             #check right:
  231.             if tail[1]==N-1:pass
  232.             elif board_map[row][tail[1]+1]!='':ok=-6;return(ok)
  233.             else:pass
  234.             #check above:
  235.             if row==0:pass
  236.             else:
  237.                 #for cidx in range(head[1],tail[1]):
  238.                 for qty in rlist:
  239.                     if qty[0][:3]=='WC:':pass
  240.                     elif board_map[row-1][qty[2]]!='':ok=-7;return(ok)
  241.             #check below:
  242.             if head[0]==M-1:pass
  243.             else:
  244.                 #for cidx in range(head[1],tail[1]):
  245.                 for qty in rlist:
  246.                     if qty[0][:3]=='WC:':pass
  247.                     elif board_map[row+1][qty[2]]!='':ok=-8;return(ok)
  248.         return(ok)
  249.